/*
 * @(#) SignatureUtils.java 2016年2月2日
 *
 * Copyright 2010 NetEase.com, Inc. All rights reserved.
 */
package com.mzpai.util;

import java.util.Arrays;
import java.util.Map;

import org.apache.commons.codec.digest.DigestUtils;

/**
 * 生成及验证签名信息工具类
 *
 * @author hzgaomin
 * @version 2016年2月2日
 */
public class SignatureUtils {

    /**
     * 默认使用md5方式
     * @param secretKey
     * @param params
     * @return
     */
    public static String genSignature(String secretKey, Map<String, String> params) {
        return genSignature(secretKey, params.get("signatureMethod"), params);
    }

    /**
     * 通用签名方式
     * @param secretKey
     * @param signatureMethod
     * @param params
     * @return
     */
    public static String genSignature(String secretKey, String signatureMethod, Map<String, String> params) {
        // 1. 参数名按照ASCII码表升序排序
        String[] keys = params.keySet().toArray(new String[0]);
        Arrays.sort(keys);
        // 2. 按照排序拼接参数名与参数值
        StringBuilder sb = new StringBuilder();
        for (String key : keys) {
            sb.append(key).append(params.get(key));
        }
        // 3. 将secretKey拼接到最后
        sb.append(secretKey);
        try {
            // 默认使用MD5
            SignatureMethodEnum signatureMethodEnum = StringUtils.isBlank(signatureMethod) ?
                    SignatureMethodEnum.MD5 : SignatureMethodEnum.valueOf(signatureMethod.toUpperCase());
            switch (signatureMethodEnum) {
                case MD5:  return DigestUtils.md5Hex(sb.toString().getBytes("UTF-8"));
                case SHA1: return DigestUtils.sha1Hex(sb.toString().getBytes("UTF-8"));
                case SHA256: return DigestUtils.sha256Hex(sb.toString().getBytes("UTF-8"));
                default:
                    System.out.println("[ERROR] unsupported signature method: " + signatureMethod);
                    return null;
            }
        } catch (Exception e) {
            System.out.println("[ERROR] not supposed to happen: " + e.getMessage());
        }
        return null;
    }

}
